"""
LeetCode 热题

给你一个整数数组 nums，返回 数组 answer ，其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。

题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在  32 位 整数范围内。

请 不要使用除法，且在 O(n) 时间复杂度内完成此题。

要解决这个问题，我们需要计算每个元素的前缀积和后缀积，然后将它们相乘得到结果。具体步骤如下：
创建两个数组 prefix_products 和 suffix_products，分别用于存储每个元素的前缀积和后缀积。
遍历数组 nums，计算每个位置的前缀积并存储在 prefix_products 中。
反向遍历数组 nums，计算每个位置的后缀积并存储在 suffix_products 中。
最后，遍历数组 nums，将 prefix_products 和 suffix_products 对应位置的值相乘，得到结果数组 answer。
"""
class Solution(object):
    """
    解决方案类，提供数组中每个元素的乘积，除了自身。
    """

    def productExceptSelf(self, nums):
        """
        计算除自身外数组中所有其他元素的乘积。

        参数:
        nums: 一个整数列表。

        返回:
        一个整数列表，其中每个元素是除自身外其他所有元素的乘积。
        """
        # 初始化数组长度
        n = len(nums)
        # 初始化前缀积数组
        prefix_products = [1] * n
        # 初始化后缀积数组
        suffix_products = [1] * n
        # 初始化答案数组
        answer = [1] * n

        # 计算前缀积
        for i in range(1, n):
            prefix_products[i] = prefix_products[i - 1] * nums[i - 1]

        # 计算后缀积
        for i in range(n - 2, -1, -1):
            suffix_products[i] = suffix_products[i + 1] * nums[i + 1]

        # 计算结果
        for i in range(n):
            answer[i] = prefix_products[i] * suffix_products[i]

        # 返回结果数组
        return answer


if __name__ == '__main__':
    a = Solution()
    nums = [-1,1,0,-3,3]
    print(a.productExceptSelf(nums))  # 输出: [24, 12, 8, 6]

